package com.suray.rgv;

import com.suray.basic.wcs.path.core.Node;
import com.suray.type.RgvSonTaskResult;
import com.suray.type.RgvSonTaskStatus;

import java.io.IOException;
import java.util.List;

/**
 * 子车的功能接口，继承RgvInterface
 * 有小车的基本功能接口以及子车的特殊功能接口
 * 外部获取不到子车对象，只有子母车才能操作子车。
 */
public interface RgvSonInterface extends RgvInterface {

    /**
     * 生成子车任务脚本
     * 节点动作在nodeList里面
     * @param taskId
     * @param rgvSonTaskId
     * @param nodeList
     * @param pathIndexs : 最少包含起点和终点对应nodeList的下标, 中间可以添加取货、放货等动作对应的下标
     * @param startTask
     */
    void sendTask(Object taskId, int rgvSonTaskId, List<Node> nodeList, int[] pathIndexs, boolean startTask)
            throws IOException;

    /**
     * 发送行驶段
     * @param segment
     */
    void sendSegment(int segment) throws IOException;

    /**
     * 设置子车速度
     */
    void setRgvSonSpeedScript() throws IOException;

    /**
     * 获取子车已完成步骤
     * @return
     */
    int getRgvTaskEndSegment();

    /**
     * 获取子车当前任务id
     * @return
     */
    int getRgvCurTaskId();

    /**
     * 子车是否可执行任务
     * @return
     */
    RgvSonTaskStatus getRgvSonTaskStatus();

    /**
     * 获取子车任务执行结果
     * @return
     */
    RgvSonTaskResult getRgvSonTaskResult();

    /**
     *
     * @return
     */
    int getRgvSonTaskErrorCode();

    /**
     * 获取执行结果
     * @return
     */
    int getActionResult();

    /**
     * 原地校准
     * @param taskId
     */
    void calibration(Object taskId) throws IOException;

    /**
     * 按速度行驶
     * @param taskId
     * @param direction
     */
    void moveSpeedAction(Object taskId, Integer direction) throws IOException;

    /**
     * 按速度停止
     * @param taskId
     */
    void stopMoveBySpeed(String taskId) throws IOException;

    /**
     * 顶升按速度移动
     * @param taskId
     */
    void palletUpBySpeed(Object taskId, boolean up) throws IOException;

    /**
     * 充电
     * @param taskId
     */
    void charge(Object taskId) throws IOException;

    /**
     * 停止充电
     * @param taskId
     */
    void stopCharge(Object taskId) throws IOException;

    /**
     * 纯位移行驶
     * @param taskId
     * @param direction
     */
    void moveByDistance(Object taskId, Integer direction) throws IOException;

    /**
     * 行驶位移量清零
     * @param taskId
     */
    void clearMoveOdo(Object taskId) throws IOException;

    /**
     * 升降位移量清零
     * @param taskId
     */
    void clearPalletOdo(Object taskId) throws IOException;

    /**
     * 托盘校准
     * @param taskId
     */
    void palletCalibration(Object taskId) throws IOException;

    /**
     * 清除任务
     * @param taskId
     * @throws IOException
     */
    void clearTask(Object taskId) throws IOException;

    /**
     * 动作结果确认
     */
    void actionResultConfirm() throws IOException;

    /**
     * 清除故障
     */
    void clearError() throws IOException;

    /**
     * 任务启动
     */
    void taskStart() throws IOException;

    /**
     * 清除任务
     */
    void clearTask() throws IOException;

    /**
     * 托盘顶升
     * @throws IOException
     * @param taskId
     */
    void palletUp(Object taskId) throws IOException;

    /**
     * 托盘下降
     * @throws IOException
     * @param taskId
     */
    void palletDown(Object taskId) throws IOException;

    /**
     * 获取当前扫到的地码
     * @return
     */
    String getGroundCode();

    /**
     * 任务是否完成
     * @param taskId
     * @return
     */
    boolean isTaskEnd(Object taskId);

    /**
     * 是否在母车里面
     * @return
     */
    boolean isInMother();

    /**
     * 修改子车速度，加速度，减速度
     * @param moveSpeed
     * @param moveSpeedAcc
     * @param moveSpeedDec
     */
    void changeSpeedConfig(Integer moveSpeed, Integer moveSpeedAcc, Integer moveSpeedDec);

    /**
     * 小车方向
     * x增大方向
     * 为右：true
     * 为左：false
     */
    void setRgvDirectionX(Boolean rgvDirection);

    /**
     * 小车方向
     * y增大方向
     * 为右：true
     * 为左：false
     */
    void setRgvDirectionY(Boolean rgvDirection);

    /**
     * 获取母车上的子车条码
     * @return
     */
    String getSonGroundCodeInMother();

    /**
     * 写入母车上子车的条码
     * @param platformGroundCode
     */
    void setPlatformGroundCode(String platformGroundCode);

    /**
     * 子车是否能够执行任务
     * @return
     */
    boolean checkSonRgvStatusCanDoTask();

    /**
     * 子车是否无任务
     * @return
     */
    boolean isSonRgvNoTask();

    /**
     * 获取子车当前的指令编号
     * @return
     */
    Integer getCurActionNo();

    /**
     * 检测异常
     */
    void checkException();

    /**
     * 子车信息是否失效
     * @return
     */
    boolean isDataInfoOutTime();

    /**
     * 子车是否启用
     * @return
     */
    boolean isRgvEnable();

    /**
     * 启用子车
     */
    void enableRgv();

    /**
     * 停用子车
     */
    void disableRgv();

    /**
     * 获取子车故障码
     * @return
     */
    int getErrorCode();

    /**
     * 获取子车警告码
     * @return
     */
    int getWarnCode();

    /**
     * 获取子车数据更新时间
     * @return
     */
    long getRgvSonDataTime();

    /**
     * 与Object绑定
     * @param obj
     * @return
     */
    boolean contactObject(Object obj);

    /**
     * 解除Object绑定
     * @param obj
     * @return
     */
    boolean clearContact(Object obj);

    /**
     * 获取绑定对象
     * @return
     */
    Object getContactObject();
}
